#include "EntityKey_Control.h"
#include "Menu.h"
#include "PCF8563_control.h"
#include "RTX51TNY.H"
#include "Validation_Sys.h"
#include "buzzer_control.h"
#include "engine_control.h"
#include "leds_control.h"
#include "matrixkeys_control.h"
#include "motor_control.h"
#include "nixie_control.h"
#include "oled_control.h"
#include "uart_control.h"
#include "DHT_control.h"
#include "redray_control.h"


//函数声明
void Rx1Work(unsigned char *RX1Buffer, unsigned char RX1Len);
void APP(unsigned char *RX2Buffer, unsigned char RX2Len);

char CurrMode = 0; // 当前模式
char NextMode = 0; // 下个模式
char BinSw=0;//垃圾桶开关

void System_Init() _task_ 1 {
    DHT_Init();//与超声波引脚冲突P46
    Motor_Init();//马达初始化
    Engine_Init();//舵机初始化
    

    os_delete_task(1); // kill oneself
}

void Launch() _task_ 0 {
    os_create_task(1); // 系统初始化
    os_create_task(2); // 系统时钟
    os_create_task(4); // 密码验证系统
    os_create_task(6); // 串口系统

    os_delete_task(0); // kill oneself
}

void RTC()_task_ 2{//系统时钟
    Clock_t clock = {2025, 5, 15, 4, 23, 58, 50};
    PCF8563_Init();
    PCF8563_Set_Clock(clock);
    os_delete_task(2);
}

void EntityKey() _task_ 3 { // 独立按键任务
    EntityKey_Init();//独立按键配置
    while (1) {
        EntityKey_Scan(); // 按键扫描
        os_wait2(K_TMO, 4);
    }
}
void UART() _task_ 6{
    UART_Init();
    UART_APP_Control(APP);
    UART_RX1CallBack(Rx1Work);//串口1接收回调函数注册
    UART_GetRX2();
    UART_GetRX1();//串口1接收数据回调
    while (1){
        //UART_Echo();
        UART_BLUE();
        os_wait2(K_TMO,5);
    }
}


void ValidationSys() _task_ 4 { // 密码验证系统
    MatrixKeys_Init();          // 初始化矩阵键盘
    OLED_Init();                // 初始化屏幕
    EEPROM_Erase(0x00);
    EEPROM_Write(0x00, "123456", 7);// 设置初始化密码为123456
    while (1) {
        MatrixKey_Scan();
        if (Validation_Sys())
            break;
        os_wait2(K_TMO,20);
    }
    os_create_task(5);//创建菜单系统任务，关闭验证系统任务
    os_delete_task(4); // kill oneself
}

void Menu() _task_ 5 { // 菜单&屏幕任务
    Menu_Init();
    os_create_task(3); // 创建独立按键任务
    while (1) {
        if (NextMode != CurrMode) {
            CurrMode = NextMode;
            OLED_Clear();
            switch (NextMode) {
            case 0: // 负一屏
                HiBoard();
                break;
            case 1: // 主页
                HomePage();
                break;
            case 2: // 多级菜单
                Multi_Menu();
                NextMode = 1; // 多级菜单返回后自动回到首页
                break;
            }
        }
        os_wait2(K_TMO, 40);
    }
}

// 这是独立按键回调的实现，可以不调用但是得有
void EntityKey_Trigger(unsigned char index, unsigned char Event) {
    if (CurrMode != 2) { // 非多级菜单
        switch (index) {
        case 1: // 按键1
            switch (Event) {
            case KEY_CLICK:
                NextMode--;
                break;
            }
            break;
        case 2: // 按键2
            switch (Event) {
            case KEY_CLICK:
                NextMode++;
                break;
            }
            break;
        }
    }
}

//串口1 接受数据回调的具体操作函数的实现
void Rx1Work(unsigned char *RX1Buffer, unsigned char RX1Len){
    char i;
    for(i=0;i<RX1Len;i++){
        printf("%c",RX1Buffer[i]);
    }
}


void APP(unsigned char *RX2Buffer, unsigned char RX2Len){
    unsigned char i;
    for(i=0;i<RX2Len;i++){
        if(RX2Buffer[0]==0x10){
            Engine_SetAngle(0);
            BinSw=0;
            Motor_SetSpeed(0);
        }else if(RX2Buffer[0]==0x11){
            Engine_SetAngle(180);
            BinSw=1;
            Motor_SetSpeed(0);
        }
    }

}

